const Koa = require('koa')
const router = require('koa-router')() // 注意：引入的方式
const views = require('koa-views')
const common = require('./module/common')
const app = new Koa()

// 配置第三方中间件
app.use(views('views', {map: {html: 'ejs'}})) // 后缀名.html
// 
// app.use(views(__dirname + '/views', {extension: 'ejs'})) // 后缀名.ejs

// 注意：我们需要在每一个路由的render里面都要渲染一个公共的数据
// ctx.state = {
//   session: this.session,
//   title: 'app'
// };
// 写一个中间件配置公共的信息
app.use(async (ctx, next) => {
  ctx.state = {
    title: 'app'
  };
  await next() // 当前路由匹配完成以后继续向下匹配，不写 next 就不会继续向下匹配
})
// 1. 应用级中间件 匹配任何路由
// 3. 错误处理中间件
app.use(async (ctx, next) => {
  await next();
  if(ctx.status === 404) {
    ctx.status = 404;
    ctx.body = '这是一个404页面'
  }
})

// ctx 上下文context，包含了request和response等信息
// 配置路由
router.get('/', async function (ctx) {
  await ctx.render('index')
  // ctx.body = 'hello koa' // 返回数据 相当于：原生里面的res.writeHead() res.end()
})

router.get('/login', async function(ctx) {
  await ctx.render('login')
})

router.post('/doLogin', async ctx => {
  let res = await common.getPostData(ctx)
  ctx.body = res
})

// 作用：启动路由
app.use(router.routes()).use(router.allowedMethods())  // 可以配置也可以不配置，建议配置
// 作用：这是官方文档的推荐用法，我们可以看到router.allowedMethods()用在了路由匹配router.routes()之后，所以在当所有路由中间件最后调用，此时根据ctx.status设置response响应头

app.listen(3000, () => {
  console.log('starting at port 3000')
})
